package leetcode.cn;

import java.util.Arrays;

/**
 * @version 1.8
 * @Author Djx_hmbb
 * @Date 2023/11/8 20:22
 * @注释:力扣209长度最小的子数组
 */
public class MinSubArrayLen {
    /*
    给定一个含有 n 个正整数的数组和一个正整数 target 。
    找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ，
    并返回其长度。如果不存在符合条件的子数组，返回 0 。
    */

    //法一 按照老师的解法，自己写的代码：
    public static int minSubArrayLen1(int target, int[] nums) {
        int n = nums.length, left = 0, right = 0, sum = 0, ret = 0, len = Integer.MAX_VALUE;
        sum += nums[right];
        while (left < n) {
            if (sum >= target) {
                ret = right - left + 1;
                if (ret <= len) {
                    len = ret;
                }
                sum -= nums[left++];
            } else {
                right++;
                if(right>=n)break;
                sum += nums[right];
            }
        }
        return len == Integer.MAX_VALUE? 0:len;
    }

    //法二：老师写的代码
    public static int minSubArrayLen2(int target, int[] nums) {
        int n = nums.length,sum = 0,len = Integer.MAX_VALUE;
        for(int left = 0,right = 0;right<n;right++){
            sum+=nums[right];
            while (sum>=target){
                len = Math.min(len,right-left+1);
                sum-=nums[left++];
            }
        }
        return len == Integer.MAX_VALUE?0:len;
    }

    public static void main(String[] args) {
        int[] nums = {1,1,1,1,1,1,1,1};
        int t = 11;
        int i = minSubArrayLen1(t, nums);
        System.out.println(i);
    }
}
